&НаКлиенте
Перем ОбработкаПеретаскивание;

&НаСервере
Функция ОписаниеТипа(ТипСтрокой) Экспорт

	МассивТипов = Новый Массив;
	МассивТипов.Добавить(Тип(ТипСтрокой));
	ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);

	Возврат ОписаниеТипов;

КонецФункции

// вОписаниеТипа()
&НаСервере
Функция ПолучитьСписокВидовОбъектов()
	ТЗ = ДанныеФормыВЗначение(ТабличноеПолеВидыОбъектов, Тип("ТаблицаЗначений"));

	СписокВыбранных = Новый СписокЗначений;
	СписокВыбранных.ЗагрузитьЗначения(ТЗ.ВыгрузитьКолонку("ИмяТаблицы"));

	Возврат СписокВыбранных;
КонецФункции

&НаКлиенте
Процедура ОткрытьФормуВыбораТаблицы()
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("ТипОбъекта", Объект.ТипОбъекта);
	СтруктураПараметров.Вставить("ОбрабатыватьТабличныеЧасти", Объект.ОбрабатыватьТабличныеЧасти);
	СтруктураПараметров.Вставить("СписокВыбранных", ПолучитьСписокВидовОбъектов());

	ОткрытьФорму(ПолучитьПолноеИмяФормы("ФормаВыбораТаблиц"), СтруктураПараметров, ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("ОткрытьФормуВыбораТаблицыЗавершение", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьФормуВыбораТаблицыЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТабличноеПолеВидыОбъектов.Очистить();
	Для Каждого Значение Из Результат Цикл

		Строка = ТабличноеПолеВидыОбъектов.Добавить();
		Строка.ИмяТаблицы = Значение.Значение;
		Строка.ПредставлениеТаблицы = Значение.Представление;

	КонецЦикла;
	ИнициализацияЗапроса();

КонецПроцедуры

// () 
&НаКлиенте
Процедура ТабличноеПолеВидыОбъектовПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	ОткрытьФормуВыбораТаблицы();
	Отказ = Истина;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//	ОбработкаПеретаскивание = Ложь;
	СписокВыбора = Элементы.ОбъектПоиска.СписокВыбора;
	Элементы.ОбъектПоиска.ВысотаСпискаВыбора = 15;

	Для Каждого Справочник Из Метаданные.Справочники Цикл
		Если ПравоДоступа("Просмотр", Справочник) Тогда
			ИмяСправочника = Справочник.Синоним;
			Если ИмяСправочника = "" Тогда
				ИмяСправочника = Справочник.Имя;
			КонецЕсли;

			Структура = Новый Структура;
			Структура.Вставить("Тип", "Справочник");
			Структура.Вставить("Имя", Справочник.Имя);
			Структура.Вставить("Представление", ИмяСправочника);

			СписокВыбора.Добавить(Структура, ИмяСправочника, , БиблиотекаКартинок.Справочник);
		КонецЕсли;
	КонецЦикла;

	Для Каждого Документ Из Метаданные.Документы Цикл
		Если ПравоДоступа("Просмотр", Документ) Тогда
			ИмяДокумента = Документ.Синоним;
			Если ИмяДокумента = "" Тогда
				ИмяДокумента = Документ.Имя;
			КонецЕсли;

			Структура = Новый Структура;
			Структура.Вставить("Тип", "Документ");
			Структура.Вставить("Имя", Документ.Имя);
			Структура.Вставить("Представление", ИмяДокумента);

			СписокВыбора.Добавить(Структура, ИмяДокумента, , БиблиотекаКартинок.Документ);
		КонецЕсли;
	КонецЦикла;

	РеквизитФормыВЗначение("Объект").ЗагрузитьОбработки(ЭтаФорма, ДоступныеОбработки, ВыбранныеОбработки);

	ВКонфигурацииЕстьКатегории = Метаданные.Справочники.Найти("КатегорииОбъектов") <> Неопределено;
	ВКонфигурацииЕстьСвойства = Метаданные.ПланыВидовХарактеристик.Найти("СвойстваОбъектов") <> Неопределено;
	ВКонфигурацииЕстьУправлениеЗаказами = Метаданные.РегистрыСведений.Найти(
		"НоменклатураНеиспользуемаяВВебУправленииЗаказами") <> Неопределено;

	УИ_РаботаСФормами.ФормаПриСозданииНаСервереСоздатьРеквизитыПараметровЗаписи(ЭтотОбъект,
		Элементы.ГруппаПараметрыЗаписи);
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъектПоискаПриИзменении(Элемент)
	ПриИзмененииОбъектаПоиска();
КонецПроцедуры

&НаСервере
Процедура ПриИзмененииОбъектаПоиска()
//	УстановитьВидимостьДоступность();
	ТекстЗапроса = ПолучитьТекстЗапроса();
	ТекстПроизвольногоЗапроса = ТекстЗапроса;
	ОтборДанных = Неопределено;
	ПараметрыЗапроса.Очистить();
КонецПроцедуры

&НаСервере
Функция СформироватьУсловиеПоискаПоСтроке()
	УсловиеПоискаПоСтроке = "";

	Если СтрокаПоиска <> "" Тогда
		ИскомыйОбъект = ОбъектПоиска;
		ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИскомыйОбъект.Тип + "." + ИскомыйОбъект.Имя);

		УсловиеПоискаПоСтроке = "";

		СтрокаДляПоиска = СтрЗаменить(СтрокаПоиска, """", """""");

		Если ИскомыйОбъект.Тип = "Справочник" Тогда
			Если ОбъектМетаданных.ДлинаНаименования <> 0 Тогда
				Если УсловиеПоискаПоСтроке <> "" Тогда
					УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " ИЛИ ";
				КонецЕсли;
				УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " Наименование ПОДОБНО ""%" + СтрокаДляПоиска + "%""";
			КонецЕсли;

			Если ОбъектМетаданных.ДлинаКода <> 0 И ОбъектМетаданных.ТипКода
				= Метаданные.СвойстваОбъектов.ТипКодаСправочника.Строка Тогда
				Если УсловиеПоискаПоСтроке <> "" Тогда
					УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " ИЛИ ";
				КонецЕсли;
				УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " Код ПОДОБНО ""%" + СтрокаДляПоиска + "%""";
			КонецЕсли;
		ИначеЕсли ИскомыйОбъект.Тип = "Документ" Тогда
			Если ОбъектМетаданных.ТипНомера = Метаданные.СвойстваОбъектов.ТипНомераДокумента.Строка Тогда
				Если УсловиеПоискаПоСтроке <> "" Тогда
					УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " ИЛИ ";
				КонецЕсли;
				УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " Номер ПОДОБНО ""%" + СтрокаДляПоиска + "%""";
			КонецЕсли;
		КонецЕсли;

		Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл
			Если Реквизит.Тип.СодержитТип(Тип("Строка")) Тогда
				Если УсловиеПоискаПоСтроке <> "" Тогда
					УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + " ИЛИ ";
				КонецЕсли;
				УсловиеПоискаПоСтроке = УсловиеПоискаПоСтроке + Реквизит.Имя + " ПОДОБНО ""%" + СтрокаДляПоиска + "%""";
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Возврат УсловиеПоискаПоСтроке;
КонецФункции

&НаСервере
Функция ПолучитьТекстЗапроса()

	ИскомыйОбъект = ОбъектПоиска;
	ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИскомыйОбъект.Тип + "." + ИскомыйОбъект.Имя);
	Условие = "";

	ТекстЗапроса = "ВЫБРАТЬ 
				   |	Ссылка КАК Объект, 
				   |	Представление";

	Если ИскомыйОбъект.Тип = "Справочник" Тогда
		Если ОбъектМетаданных.ОсновноеПредставление
			<> Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСправочника.ВВидеНаименования Тогда
			Если ОбъектМетаданных.ДлинаНаименования <> 0 Тогда
				ТекстЗапроса = ТекстЗапроса + ", 
											  |	Наименование";
			КонецЕсли;
			Если ОбъектМетаданных.ДлинаКода <> 0 Тогда
				Условие = "Код";
			КонецЕсли;
		КонецЕсли;
		Если ОбъектМетаданных.ОсновноеПредставление
			<> Метаданные.СвойстваОбъектов.ОсновноеПредставлениеСправочника.ВВидеКода Тогда
			Если ОбъектМетаданных.ДлинаКода <> 0 Тогда
				ТекстЗапроса = ТекстЗапроса + ",
											  |	Код";
			КонецЕсли;
			Если ОбъектМетаданных.ДлинаНаименования <> 0 Тогда
				Условие = "Наименование";
			КонецЕсли;
		КонецЕсли;
	ИначеЕсли ИскомыйОбъект.Тип = "Документ" Тогда
		Условие = "Дата, Номер";
	КонецЕсли;

	Для Каждого Реквизит Из ОбъектМетаданных.Реквизиты Цикл
		ТекстЗапроса = ТекстЗапроса + ",
									  |	" + Реквизит.Имя;
	КонецЦикла;

	ТекстЗапроса = ТекстЗапроса + Символы.ПС + "ИЗ" + Символы.ПС;
	ТекстЗапроса = ТекстЗапроса + "	" + ИскомыйОбъект.Тип + "." + ОбъектМетаданных.Имя + " КАК _Таблица" + Символы.ПС;

	Для Каждого ТЧ Из ОбъектМетаданных.ТабличныеЧасти Цикл
		Для Каждого ТЧР Из ТЧ.Реквизиты Цикл
			Если Условие <> "" Тогда
				Условие = Условие + ",";
			КонецЕсли;
			Условие = Условие + ТЧ.Имя + "." + ТЧР.Имя + ".* КАК " + ТЧ.Имя + ТЧР.Имя;
		КонецЦикла;
	КонецЦикла;

	//Если Условие <> "" Тогда
	//	ТекстЗапроса = ТекстЗапроса + "{ГДЕ " + Условие + "}" + Символы.ПС;
	//КонецЕсли;

	//Если УсловиеПоискаПоСтроке <> "" Тогда
	//	ТекстЗапроса = ТекстЗапроса + "ГДЕ " + УсловиеПоискаПоСтроке + Символы.ПС;
	//КонецЕсли;
	Возврат ТекстЗапроса;
КонецФункции

&НаКлиенте
Процедура ОбъектПоискаОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	Если ЗначениеЗаполнено(ВыбранноеЗначение) Тогда
		ОбъектПоискаПредставление = ВыбранноеЗначение.Представление;
		ОбъектПоиска = ВыбранноеЗначение;
	Иначе
		ОбъектПоискаПредставление = "";
		ОбъектПоиска = Неопределено;
	КонецЕсли;

	ПриИзмененииОбъектаПоиска();
КонецПроцедуры

&НаКлиенте
Процедура НайтиСсылки(Команда)
	
	Если ТабличноеПолеВидыОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	Состояние("Поиск ссылок...");
	НайтиСсылкиПоОтбору();
	Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаНаденныеОбъекты;
КонецПроцедуры

&НаСервере
Процедура НайтиСсылкиПоОтбору()

	ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

	Запрос = Новый Запрос;

	Если Объект.РежимПоиска = 1 Тогда
		Запрос.Текст = ТекстПроизвольногоЗапроса;
		Для Каждого СтрокаПараметров Из ПараметрыЗапроса Цикл
			Если СтрокаПараметров.ЭтоВыражение Тогда
				Запрос.УстановитьПараметр(СтрокаПараметров.ИмяПараметра, Вычислить(СтрокаПараметров.ЗначениеПараметра));
			Иначе
				Запрос.УстановитьПараметр(СтрокаПараметров.ИмяПараметра, СтрокаПараметров.ЗначениеПараметра);
			КонецЕсли;
		КонецЦикла;
	Иначе
		Запрос.Текст = ТекстЗапроса;
		УсловиеПоискаПоСтроке = СформироватьУсловиеПоискаПоСтроке();
		СписокУсловий = УсловиеПоискаПоСтроке;

		Если ОтборДанных <> Неопределено Тогда
			Для Каждого ЭлементОтбора Из ОтборДанных.Отбор.Элементы Цикл
				Если Не ЭлементОтбора.Использование Тогда
					Продолжить;
				КонецЕсли;

				Индекс = ОтборДанных.Отбор.Элементы.Индекс(ЭлементОтбора);
				ИмяПараметра = СтрЗаменить(Строка(ЭлементОтбора.ЛевоеЗначение) + Индекс, ".", "");

				СписокУсловий = СписокУсловий + ?(СписокУсловий = "", "", "
																		  |	И ")
					+ ОбработкаОбъект.ПолучитьВидСравнения(ЭлементОтбора.ЛевоеЗначение, ЭлементОтбора.ВидСравнения,
					ИмяПараметра);

				Если ТипЗнч(ЭлементОтбора.ПравоеЗначение) = Тип("СтандартнаяДатаНачала") Тогда
					Запрос.УстановитьПараметр(ИмяПараметра, ЭлементОтбора.ПравоеЗначение.Дата);
				Иначе
					Запрос.УстановитьПараметр(ИмяПараметра, ЭлементОтбора.ПравоеЗначение);
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;

		Если СписокУсловий <> "" Тогда
			Запрос.Текст = Запрос.Текст + "
										  |ГДЕ 
										  |	" + СписокУсловий;
		КонецЕсли;

		ТекстЗапросаОкончание = "";

		Если Объект.ТипОбъекта = 1 Тогда

			ТекстЗапросаОкончание = ТекстЗапросаОкончание + "
															|УПОРЯДОЧИТЬ ПО
															|	Ш_Дата,
															|	Объект";
			ПоляСортировки = "Ш_Дата,Объект";

		Иначе

			ТекстЗапросаОкончание = ТекстЗапросаОкончание + "
															|УПОРЯДОЧИТЬ ПО
															|	Ш_Вид,
															|	Объект";
			ПоляСортировки = "Ш_Вид,Объект";

		КонецЕсли;

		Если Объект.ОбрабатыватьТабличныеЧасти Тогда
			ТекстЗапросаОкончание = ТекстЗапросаОкончание + ",
															|	Т_ТЧ,
															|	Т_НомерСтроки";
			ПоляСортировки = ПоляСортировки + ",Т_ТЧ,Т_НомерСтроки";
		КонецЕсли;

		Запрос.Текст = Запрос.Текст + ТекстЗапросаОкончание;

	КонецЕсли;

	Попытка
		ТЗ = Запрос.Выполнить().Выгрузить();
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат;
	КонецПопытки;

	МассивРеквизитов = Новый Массив;
	МассивРеквизитов.Добавить("Объект");
	МассивРеквизитов.Добавить("Картинка");
	МассивРеквизитов.Добавить("Выбрать");

	СоздатьКолонки(ТЗ, МассивРеквизитов);

КонецПроцедуры

&НаКлиенте
Процедура ВыбратьВсе(Команда)
	ВыбратьЭлементы(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьВыборВсех(Команда)
	ВыбратьЭлементы(Ложь);
КонецПроцедуры

&НаСервере
Процедура ВыбратьЭлементы(Выбор)
	Для Каждого Стр Из НайденныеОбъекты Цикл
		Стр.Выбрать = Выбор;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьОбработку(Команда)
	Для Каждого Строка Из ВыбранныеОбработки Цикл
		ОбработкаПрерыванияПользователя();

		Если Не Строка.Выбрать Тогда
			Продолжить;
		КонецЕсли;

		Стр = ДоступныеОбработки.НайтиПоИдентификатору(Строка.СтрокаДоступнойОбработки);
		Родитель = Стр.ПолучитьРодителя();

		СтруктураПараметров = СформироватьСтруктуруПараметров();
		СтруктураПараметров.Настройка = Стр.Настройка[0].Значение;

		Если Родитель = Неопределено Тогда
			ИмяФормыОбработки = Стр.ИмяФормы;

			СтруктураПараметров.Настройки = СформироватьНастройки(Стр);
			СтруктураПараметров.Вставить("Родитель", Стр.ПолучитьИдентификатор());
			СтруктураПараметров.Вставить("ТекущаяСтрока", Неопределено);
		Иначе
			ИмяФормыОбработки = Родитель.ИмяФормы;

			СтруктураПараметров.Настройки = СформироватьНастройки(Родитель);
			СтруктураПараметров.Вставить("Родитель", Родитель.ПолучитьИдентификатор());
			СтруктураПараметров.Вставить("ТекущаяСтрока", Строка.СтрокаДоступнойОбработки);
		КонецЕсли;

		Если Не ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"), ИмяФормыОбработки) Тогда
			Сообщить("Обработка " + ИмяФормы + " недоступна для типа <" + ОбъектПоиска.Тип + ">");
			Продолжить;
		КонецЕсли;

		Обработка = ПолучитьФорму(ПолучитьПолноеИмяФормы(ИмяФормыОбработки), СтруктураПараметров, ЭтаФорма);
		Обработка.ЗагрузитьНастройку();
		Если ИмяФормыОбработки = "ПроизвольныйАлгоритм" Тогда
			Обработка.ВыполнитьОбработку();
		Иначе
			ПараметрыЗаписиОбъектов = УИ_ОбщегоНазначенияКлиентСервер.ПараметрыЗаписиФормы(ЭтотОбъект);
			Обработка.ВыполнитьОбработку(ПараметрыЗаписиОбъектов);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

&НаСервере
Процедура СоздатьКолонки(ТЗ, МассивРеквизитовПоУмолчанию = Неопределено) Экспорт
	ТаблицаЭлемент = Элементы.НайденныеОбъекты;

	//очистка
	Для Каждого ДобавленныйЭлемент Из ДобавленныеЭлементы Цикл
		Элементы.Удалить(Элементы[ДобавленныйЭлемент.Значение]);
	КонецЦикла;
	ДобавленныеЭлементы.Очистить();

	//добавляем реквизиты
	МассивРеквизитов = Новый Массив;
	Для Каждого Колонка Из ТЗ.Колонки Цикл
		Если МассивРеквизитовПоУмолчанию <> Неопределено И МассивРеквизитовПоУмолчанию.Найти(Колонка.Имя)
			<> Неопределено Тогда
			Продолжить;
		КонецЕсли;

		ТипКолонки = Строка(Колонка.ТипЗначения);
		Если Колонка.Имя = "Представление" Или Найти(ТипКолонки, "Хранилище значения") > 0 Тогда
			Продолжить;
		КонецЕсли;

		РеквизитФормы = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ТаблицаЭлемент.Имя);

		Представление = "";

		Для Каждого Элемент Из СписокПредставлений Цикл
			Если Элемент.Представление = Колонка.Имя Тогда
				Представление = Элемент.Значение;
				Прервать;
			КонецЕсли;
		КонецЦикла;

		РеквизитФормы.Заголовок = Представление;
		МассивРеквизитов.Добавить(РеквизитФормы);
	КонецЦикла;

	ИзменитьРеквизиты(МассивРеквизитов, ДобавленныеРеквизиты.ВыгрузитьЗначения());
	ДобавленныеРеквизиты.Очистить();

	//добавляем элементы управления
	Для Каждого Реквизит Из МассивРеквизитов Цикл
		ДобавленныеРеквизиты.Добавить(Реквизит.Путь + "." + Реквизит.Имя);

		Элемент = Элементы.Добавить(ТаблицаЭлемент.Имя + Реквизит.Имя, Тип("ПолеФормы"), ТаблицаЭлемент);
		Элемент.Вид = ВидПоляФормы.ПолеВвода;
		Элемент.ПутьКДанным = ТаблицаЭлемент.Имя + "." + Реквизит.Имя;
		Элемент.ТолькоПросмотр = Истина;

		ДобавленныеЭлементы.Добавить(Элемент.Имя);
	КонецЦикла;

	//заполнение данными
	РедТЗ = РеквизитФормыВЗначение(ТаблицаЭлемент.Имя);
	РедТЗ.Очистить();
	Для Каждого Стр Из ТЗ Цикл
		НовСтр = РедТЗ.Добавить();
		ЗаполнитьЗначенияСвойств(НовСтр, Стр);

		НовСтр.Выбрать = Истина;

		//Если ОбъектПоиска = Неопределено Тогда
		//	Продолжить;
		//КонецЕсли;
		Если Объект.ТипОбъекта = 0 Тогда //"Справочник" Тогда
			Если Стр.Объект.ЭтоГруппа Тогда
				Если Стр.Объект.ПометкаУдаления Тогда
					НовСтр.Картинка = 3;
				Иначе
					НовСтр.Картинка = 0;
				КонецЕсли;
			Иначе
				Если Стр.Объект.ПометкаУдаления Тогда
					НовСтр.Картинка = 4;
				Иначе
					НовСтр.Картинка = 1;
				КонецЕсли;
			КонецЕсли;
		Иначе
			Если Стр.Объект.Проведен Тогда
				НовСтр.Картинка = 7;
			ИначеЕсли Стр.Объект.ПометкаУдаления Тогда
				НовСтр.Картинка = 8;
			Иначе
				НовСтр.Картинка = 6;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	ЗначениеВРеквизитФормы(РедТЗ, ТаблицаЭлемент.Имя);
КонецПроцедуры

&НаСервере
Функция ПолучитьПолноеИмяФормы(ИмяНужнойФормы)
	МассивСтрок = СтрРазделить(ЭтаФорма.ИмяФормы, ".");
	МассивСтрок[МассивСтрок.Количество() - 1] = ИмяНужнойФормы;

	Возврат СтрСоединить(МассивСтрок, ".");
КонецФункции

&НаКлиенте
Процедура Отбор(Команда)
	Если ТабличноеПолеВидыОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("ТекстЗапроса", ТекстЗапроса);
	СтруктураПараметров.Вставить("ТекстПроизвольногоЗапроса", ТекстПроизвольногоЗапроса);
	СтруктураПараметров.Вставить("СтрокаПоиска", СтрокаПоиска);
	СтруктураПараметров.Вставить("Настройки", ОтборДанных);
	СтруктураПараметров.Вставить("СписокВыбранных", ПолучитьСписокВидовОбъектов());
	СтруктураПараметров.Вставить("РежимПоиска", Объект.РежимПоиска);
	СтруктураПараметров.Вставить("ПараметрыЗапроса", ПараметрыЗапроса);
	СтруктураПараметров.Вставить("СписокПредставлений", СписокПредставлений);

	ОткрытьФорму(ПолучитьПолноеИмяФормы("ФормаОтбора"), СтруктураПараметров, ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("ОтборЗавершение", ЭтотОбъект), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ОтборЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ОбработатьРезультатОтбора(Результат);
КонецПроцедуры

&НаСервере
Процедура ОбработатьРезультатОтбора(РезультатОтбора)
	ОтборДанных = РезультатОтбора.Настройки;
	СтрокаПоиска = РезультатОтбора.СтрокаПоиска;
	ПараметрыЗапроса.Загрузить(РезультатОтбора.ПараметрыЗапроса.Выгрузить());

	ТекстЗапроса = РезультатОтбора.ТекстЗапроса;
	ТекстПроизвольногоЗапроса = РезультатОтбора.ТекстПроизвольногоЗапроса;
	Объект.РежимПоиска = РезультатОтбора.РежимПоиска;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
//	УстановитьВидимостьДоступность();
	УстановитьКартинкиОбработок();
КонецПроцедуры

&НаКлиенте
Процедура ДоступныеОбработкиВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	Если ТабличноеПолеВидыОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	СтандартнаяОбработка = Ложь;

	ИндексСтроки = Элементы.ДоступныеОбработки.ТекущаяСтрока;
	ТекущаяСтрока = ДоступныеОбработки.НайтиПоИдентификатору(ИндексСтроки);

	СтруктураПараметров = СформироватьСтруктуруПараметров();
	СтруктураПараметров.Настройка = ТекущаяСтрока.Настройка[0].Значение;

	Родитель = ТекущаяСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Если Не ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"), ТекущаяСтрока.ИмяФормы) Тогда
			ПоказатьПредупреждение( , "Данная обработка недоступна для типа <" + ?(Объект.ТипОбъекта = 0, "Справочник",
				"Документ") + ">");
			Возврат;
		КонецЕсли;

		СтруктураПараметров.Настройки = СформироватьНастройки(Элемент.ТекущиеДанные);
		СтруктураПараметров.Вставить("Родитель", ТекущаяСтрока.ПолучитьИдентификатор());
		СтруктураПараметров.Вставить("ТекущаяСтрока", Неопределено);

		ИмяФормыДляОткрытия=ПолучитьПолноеИмяФормы(ТекущаяСтрока.ИмяФормы);
	Иначе
		Если Не ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"), Родитель.ИмяФормы) Тогда
			ПоказатьПредупреждение( , "Данная обработка недоступна для типа <" + ?(Объект.ТипОбъекта = 0, "Справочник",
				"Документ") + ">");
			Возврат;
		КонецЕсли;

		СтруктураПараметров.Настройки = СформироватьНастройки(Родитель);
		СтруктураПараметров.Вставить("Родитель", Родитель.ПолучитьИдентификатор());
		СтруктураПараметров.Вставить("ТекущаяСтрока", ИндексСтроки);

		ИмяФормыДляОткрытия=ПолучитьПолноеИмяФормы(Родитель.ИмяФормы);
	КонецЕсли;

	ОткрытьФорму(ИмяФормыДляОткрытия, СтруктураПараметров, ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("ДоступныеОбработкиВыборЗавершение", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ДоступныеОбработкиВыборЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
КонецПроцедуры

&НаСервере
Функция СформироватьСтруктуруПараметров()
	СтруктураПараметров = Новый Структура;
	СтруктураПараметров.Вставить("Настройка", Неопределено);
	СтруктураПараметров.Вставить("Настройки", Новый Массив);
	СтруктураПараметров.Вставить("ТипОбъекта", Объект.ТипОбъекта);
	СтруктураПараметров.Вставить("ТаблицаРеквизитов", ТаблицаРеквизитов);
	СтруктураПараметров.Вставить("ОбрабатыватьТабличныеЧасти", Объект.ОбрабатыватьТабличныеЧасти);
	СтруктураПараметров.Вставить("СписокВыбранных", ПолучитьСписокВидовОбъектов());
	СтруктураПараметров.Вставить("ТабличноеПолеВидыОбъектов", ТабличноеПолеВидыОбъектов);

	СтруктураПараметров.Вставить("НайденныеОбъектыТЧ", НайденныеОбъекты);

	СтруктураОтбора = Новый Структура;
	СтруктураОтбора.Вставить("Выбрать", Истина);
	СтруктураПараметров.Вставить("НайденныеОбъекты", НайденныеОбъекты.Выгрузить(СтруктураОтбора,
		"Объект").ВыгрузитьКолонку("Объект"));

	Возврат СтруктураПараметров;
КонецФункции

&НаКлиенте
Процедура ДоступныеОбработкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	Если ТабличноеПолеВидыОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Если Элемент.ТекущиеДанные = Неопределено Тогда
		Отказ = Истина;
	КонецЕсли;

	Если Элемент.ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Если Копирование Тогда
			Отказ = Истина;
		Иначе
			Если Не ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"),
				Элемент.ТекущиеДанные.ИмяФормы) Тогда
				ПоказатьПредупреждение( , "Данная обработка недоступна для типа <" + ?(Объект.ТипОбъекта = 0,
					"Справочник", "Документ") + ">");
				Отказ = Истина;
				Возврат;
			КонецЕсли;

			Отказ = Не ПолучитьФорму(ПолучитьПолноеИмяФормы(Элемент.ТекущиеДанные.ИмяФормы)).мИспользоватьНастройки;
			Если Не Отказ Тогда
			//свое добавление
				Отказ = Истина;
				ДобавитьСтроку(Элемент.ТекущиеДанные);
			КонецЕсли;
		КонецЕсли;
	Иначе
		Если Не ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"),
			Элемент.ТекущиеДанные.ПолучитьРодителя().ИмяФормы) Тогда
			ПоказатьПредупреждение( , "Данная обработка недоступна для типа <" + ?(Объект.ТипОбъекта = 0, "Справочник",
				"Документ") + ">");
			Отказ = Истина;
			Возврат;
		КонецЕсли;
		Отказ = Истина;
		Если Не Копирование Тогда
			Если ПолучитьФорму(ПолучитьПолноеИмяФормы(
				Элемент.ТекущиеДанные.ПолучитьРодителя().ИмяФормы)).мИспользоватьНастройки Тогда
				ДобавитьСтроку(Элемент.ТекущиеДанные.ПолучитьРодителя());
			КонецЕсли;
		Иначе
			ТекСтрока = Элемент.ТекущиеДанные;
			Родитель = Элемент.ТекущиеДанные.ПолучитьРодителя();
			НоваяСтрока = ДобавитьСтроку(Родитель);

			Если Не ТекСтрока.Настройка[0].Значение = Неопределено Тогда
				НоваяНастройка = Новый Структура;
				Для Каждого РеквизитНастройки Из ТекСтрока.Настройка[0].Значение Цикл
				//@skip-warning
					Значение = РеквизитНастройки.Значение;
					Выполнить ("НоваяНастройка.Вставить(Строка(РеквизитНастройки.Ключ), Значение);");
				КонецЦикла;

				НоваяСтрока.Настройка[0].Значение = НоваяНастройка;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ДобавитьСтроку(ТекСтрока)

	НоваяСтрока = ТекСтрока.ПолучитьЭлементы().Добавить();

	Настройка = Новый Структура;
	Настройка.Вставить("Обработка", ТекСтрока.Обработка);
	Настройка.Вставить("Прочее", Неопределено);

	НоваяСтрока.Настройка.Добавить(Настройка);
	
	НоваяСтрока.Обработка = ТекСтрока.Обработка;

	Элементы.ДоступныеОбработки.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
	Элементы.ДоступныеОбработки.ИзменитьСтроку();

	Возврат НоваяСтрока;
КонецФункции

&НаКлиенте
Функция СформироватьНастройки(ТекСтрока)

	МассивНастроек = Новый Массив;
	Для Каждого Стр Из ТекСтрока.ПолучитьЭлементы() Цикл
		Если Стр.Настройка[0].Значение = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		МассивНастроек.Добавить(Стр.Настройка[0].Значение);
	КонецЦикла;

	Возврат МассивНастроек;
КонецФункции

&НаКлиенте
Процедура ДоступныеОбработкиПередНачаломИзменения(Элемент, Отказ)
	Если ТабличноеПолеВидыОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Если Элемент.ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Отказ = Истина;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ДоступныеОбработкиПередУдалением(Элемент, Отказ)
	Отказ=Истина;
	Если Элемент.ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПоказатьВопрос(Новый ОписаниеОповещения("ДоступныеОбработкиПередУдалениемЗавершение", ЭтаФорма,
		Новый Структура("ТекущаяСтрока", Элемент.ТекущаяСтрока)), "Удалить настройку?", РежимДиалогаВопрос.ОКОтмена, ,
		КодВозвратаДиалога.ОК);
КонецПроцедуры

&НаКлиенте
Процедура ДоступныеОбработкиПередУдалениемЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	ТекущаяСтрока = ДополнительныеПараметры.ТекущаяСтрока;
	Если РезультатВопроса = КодВозвратаДиалога.ОК Тогда
		ПараметрыОтбора = Новый Структура;
		ПараметрыОтбора.Вставить("СтрокаДоступнойОбработки", ТекущаяСтрока);

		МассивДляУдаления = ВыбранныеОбработки.НайтиСтроки(ПараметрыОтбора);
		Для Индекс = 0 По МассивДляУдаления.Количество() - 1 Цикл
			ВыбранныеОбработки.Удалить(МассивДляУдаления[Индекс]);
		КонецЦикла;
		СтрокаДерева = ДоступныеОбработки.НайтиПоИдентификатору(ТекущаяСтрока);
		Родитель = СтрокаДерева.ПолучитьРодителя();
		Если Родитель = Неопределено Тогда
			Родитель = ДоступныеОбработки;
		КонецЕсли;
		Родитель.ПолучитьЭлементы().Удалить(СтрокаДерева);
		
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДоступныеОбработкиНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)
	Если Не ПроверитьДоступностьОбработки() Тогда
		СтандартнаяОбработка = Ложь;
		ПоказатьПредупреждение( , "Данная обработка недоступна для типа <" + ?(Объект.ТипОбъекта = 0, "Справочник",
			"Документ") + ">");
		Возврат;
	КонецЕсли;

	ОбработкаПеретаскивание = Истина;
КонецПроцедуры

&НаКлиенте
Функция ПроверитьДоступностьОбработки()
	ИндексСтроки = Элементы.ДоступныеОбработки.ТекущаяСтрока;
	ТекущаяСтрока = ДоступныеОбработки.НайтиПоИдентификатору(ИндексСтроки);

	Родитель = ТекущаяСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Возврат ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"), ТекущаяСтрока.ИмяФормы);
	КонецЕсли;

	Возврат ОбработкаДоступна(?(Объект.ТипОбъекта = 0, "Справочник", "Документ"), Родитель.ИмяФормы);
КонецФункции

&НаКлиенте
Процедура ВыбранныеОбработкиПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле)
	Если Не ОбработкаПеретаскивание Тогда
		Возврат;
	КонецЕсли;

	Для Каждого СтрВыбранных Из ПараметрыПеретаскивания.Значение Цикл
		СтрДоступных = ДоступныеОбработки.НайтиПоИдентификатору(СтрВыбранных.ПолучитьИдентификатор());

		НовСтр = ВыбранныеОбработки.Добавить();
		НовСтр.ОбработкаНастройка = СтрДоступных.Обработка;
		НовСтр.СтрокаДоступнойОбработки = СтрДоступных.ПолучитьИдентификатор();
		НовСтр.Выбрать = Истина;
		НовСтр.Настройка = СтрДоступных.Настройка;
	КонецЦикла;

	ОбработкаПеретаскивание = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура ВыбратьВсеОбработки(Команда)
	ВыбратьОбработки(Истина);
КонецПроцедуры

&НаКлиенте
Процедура ОтменитьВыборВсехОбработок(Команда)
	ВыбратьОбработки(Ложь);
КонецПроцедуры

&НаСервере
Процедура ВыбратьОбработки(Выбор)
	Для Каждого Стр Из ВыбранныеОбработки Цикл
		Стр.Выбрать = Выбор;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Функция ОбработкаДоступна(ПроверяемыйТипОбъекта = "", ИмяОбработки)

	Если ПустаяСтрока(ПроверяемыйТипОбъекта) Тогда
		Возврат Ложь;
	КонецЕсли;

	Попытка
		ТипыОбрабатываемыхОбъектов = ПолучитьФорму(ПолучитьПолноеИмяФормы(ИмяОбработки)).мТипыОбрабатываемыхОбъектов;
	Исключение
		ПоказатьПредупреждение( , ОписаниеОшибки());
		Возврат Ложь;
	КонецПопытки;

	Если ИмяОбработки = "ПеренумерацияОбъектов" Тогда
		Если ТабличноеПолеВидыОбъектов.Количество() > 1 Тогда
			Сообщить("Выбрано более одного вида объектов. Перенумерация невозможна");
			Возврат Ложь;
		КонецЕсли;

		Если Объект.ОбрабатыватьТабличныеЧасти Тогда
			Сообщить("Перенумерация при обработке табличных частей запрещена");
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;

	Если ТипыОбрабатываемыхОбъектов = Неопределено Тогда
		Возврат Истина;
	Иначе
		Если Найти(ТипыОбрабатываемыхОбъектов, ПроверяемыйТипОбъекта) Тогда
			Возврат Истина;
		Иначе
			Возврат Ложь;
		КонецЕсли;
	КонецЕсли;
КонецФункции

&НаКлиенте
Процедура ДоступныеОбработкиПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
	Если ТабличноеПолеВидыОбъектов.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Если Элемент.ТекущиеДанные.ПолучитьРодителя() = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Настройка = Элемент.ТекущиеДанные.Настройка[0].Значение;
	Настройка.Обработка = Элемент.ТекущиеДанные.Обработка;
КонецПроцедуры

&НаКлиенте
Процедура УстановитьКартинкиОбработок()
	Для Каждого Стр Из ДоступныеОбработки.ПолучитьЭлементы() Цикл
		Стр.Картинка = БиблиотекаКартинок.Обработка;
	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ТабличноеПолеВидыОбъектовПередНачаломИзменения(Элемент, Отказ)
	ОткрытьФормуВыбораТаблицы();
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ТабличноеПолеВидыОбъектовПередУдалением(Элемент, Отказ)
	
	Отказ=Истина;
	
	ТекущаяСтрока = Элементы.ТабличноеПолеВидыОбъектов.ТекущиеДанные.ПолучитьИдентификатор();
	ДопПараметрыОповещения = Новый Структура("ТекущаяСтрока", ТекущаяСтрока);
	ПроверкаНеобходимостиОчищатьРезультаты(
			Новый ОписаниеОповещения("ТабличноеПолеВидыОбъектовПередУдалениемЗавершение", 
										ЭтотОбъект, 
										ДопПараметрыОповещения
									)
	);
	
КонецПроцедуры

&НаКлиенте
Процедура ТабличноеПолеВидыОбъектовПередУдалениемЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;

	ТекСтрока=ДополнительныеПараметры.ТекущаяСтрока;
	ТабличноеПолеВидыОбъектов.Удалить(ТабличноеПолеВидыОбъектов.НайтиПоИдентификатору(ТекСтрока));

	Элементы.ТабличноеПолеВидыОбъектов.Обновить();
КонецПроцедуры
Функция УсечьМассив(Массив, Массив2)
	Мас = Новый Массив;

	Для Каждого ТекЭлемент Из Массив Цикл
		Если Массив2.Найти(ТекЭлемент) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		Мас.Добавить(ТекЭлемент);
	КонецЦикла;

	Возврат Мас;
КонецФункции

&НаСервере
Процедура ИнициализацияЗапроса()

	масЗапросовПоОбъектам = Новый Массив;

	ВсегоСтрок = ТабличноеПолеВидыОбъектов.Количество();
	//Если ВсегоСтрок = 0 Тогда
	//	Если Не ПостроительЗапроса = Неопределено И Не ПостроительЗапроса.Отбор = Неопределено Тогда
	//		КоличествоОтборов = ПостроительЗапроса.Отбор.Количество();
	//		Для Индекс = 1 По КоличествоОтборов Цикл
	//			ПостроительЗапроса.Отбор.Удалить(КоличествоОтборов - Индекс);
	//		КонецЦикла; 
	//	КонецЕсли; 
	//	ПостроительЗапроса = Неопределено;
	//	Возврат;
	//КонецЕсли;	
	//Если ПостроительЗапроса = Неопределено Тогда
	//	ПостроительЗапроса = Новый ПостроительЗапроса;
	//КонецЕсли; 


	///============================= ИНИЦИАЛИЦАЗИЯ ПЕРЕМЕННЫХ
	МетаданныеОбъектов = Метаданные[?(Объект.ТипОбъекта = 1, "Документы", "Справочники")];
	ИмяТипаТаблицы = ?(Объект.ТипОбъекта = 1, "Документ", "Справочник");
	Префикс = ?(Объект.ОбрабатыватьТабличныеЧасти, "Ссылка.", "");

	МассивТипов = Новый Массив;
	МассивТипов.Добавить(Тип("ХранилищеЗначения"));
	ОписаниеТипаХранилище = Новый ОписаниеТипов(МассивТипов);

	МассивТипов = Новый Массив;
	СписокПредставлений.Очистить(); //      = Новый СписокЗначений;
	СтруктураРеквизитовШапки = Новый Структура;
	СтруктураРеквизитовТЧ = Новый Структура;
	СтруктураТиповОбъектов = Новый Структура;
	СтруктураКатегорий = Новый Структура;
	СтруктураСвойств = Новый Структура;
	//	МассивНастроекОтбора     = Новый Массив;
	ТаблицаРеквизитов.Очистить();

	ИмяВидаОдногоТипа = Неопределено;
	ПрошлоеЗначение = Неопределено;
	///============================= ПОДСЧЕТ ОДОИМЕННЫХ РЕКВИЗИТОВ
	Для Каждого Строка Из ТабличноеПолеВидыОбъектов Цикл

		Если Не Объект.ОбрабатыватьТабличныеЧасти Тогда
			ИмяВида = Строка.ИмяТаблицы;
			ИмяТЧ="";
		Иначе
			ПозТЧК = Найти(Строка.ИмяТаблицы, ".");
			ИмяВида = Лев(Строка.ИмяТаблицы, ПозТЧК - 1);
			ИмяТЧ = Сред(Строка.ИмяТаблицы, ПозТЧК + 1);
		КонецЕсли;

		Если МетаданныеОбъектов.Найти(ИмяВида) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		МетаданныеСтрокиОбъектов=МетаданныеОбъектов[ИмяВида];

		МетаданныеРеквизитов = МетаданныеСтрокиОбъектов.Реквизиты;

		Если Объект.ОбрабатыватьТабличныеЧасти Тогда
			МетаданныеРеквизитовТЧ = МетаданныеСтрокиОбъектов.ТабличныеЧасти[ИмяТЧ].Реквизиты;
		КонецЕсли;

		Если Объект.ТипОбъекта = 1 Тогда
			Если МетаданныеСтрокиОбъектов.ДлинаНомера > 0 Тогда
				СтруктураРеквизитовШапки.Вставить("Номер", ?(СтруктураРеквизитовШапки.Свойство("Номер",
					ПрошлоеЗначение), ПрошлоеЗначение + 1, 1));
			КонецЕсли;

			Отбор = Новый Структура;
			Отбор.Вставить("Имя", "Номер");
			Отбор.Вставить("ЭтоТЧ", Ложь);
			МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);
			Если МетаданныеСтрокиОбъектов.ТипНомера = Метаданные.СвойстваОбъектов.ТипНомераДокумента.Строка Тогда
				ТекТип = ОписаниеТипа("Строка");
			Иначе
				ТекТип = ОписаниеТипа("Число");
			КонецЕсли;

			Если МассивСтрок.Количество() > 0 Тогда
				СтрокаРеквизитов = МассивСтрок[0];
			Иначе
				СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
				СтрокаРеквизитов.Имя = "Номер";
				СтрокаРеквизитов.Представление = "Номер";
				СтрокаРеквизитов.Тип = ТекТип;
				СтрокаРеквизитов.ЭтоТЧ = Ложь;
			КонецЕсли;

			СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(), ТекТип.Типы()));

			СтруктураРеквизитовШапки.Вставить("Дата", ?(СтруктураРеквизитовШапки.Свойство("Дата", ПрошлоеЗначение), ПрошлоеЗначение
				+ 1, 1));

			Отбор = Новый Структура;
			Отбор.Вставить("Имя", "Дата");
			Отбор.Вставить("ЭтоТЧ", Ложь);
			МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);
			ТекТип = ОписаниеТипа("Дата");

			Если МассивСтрок.Количество() > 0 Тогда
				СтрокаРеквизитов = МассивСтрок[0];
			Иначе
				СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
				СтрокаРеквизитов.Имя = "Дата";
				СтрокаРеквизитов.Представление = "Дата";
				СтрокаРеквизитов.Тип = ТекТип;
				СтрокаРеквизитов.ЭтоТЧ = Ложь;
			КонецЕсли;
			СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(), ТекТип.Типы()));

			СтруктураРеквизитовШапки.Вставить("Проведен", ?(СтруктураРеквизитовШапки.Свойство("Проведен",
				ПрошлоеЗначение), ПрошлоеЗначение + 1, 1));

			Отбор = Новый Структура;
			Отбор.Вставить("Имя", "Проведен");
			Отбор.Вставить("ЭтоТЧ", Ложь);
			МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);
			ТекТип = ОписаниеТипа("Булево");

			Если МассивСтрок.Количество() > 0 Тогда
				СтрокаРеквизитов = МассивСтрок[0];
			Иначе
				СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
				СтрокаРеквизитов.Имя = "Проведен";
				СтрокаРеквизитов.Представление = "Проведен";
				СтрокаРеквизитов.Тип = ТекТип;
				СтрокаРеквизитов.ЭтоТЧ = Ложь;
			КонецЕсли;
			СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(), ТекТип.Типы()));
		Иначе
			Если МетаданныеСтрокиОбъектов.ДлинаКода > 0 Тогда
				СтруктураРеквизитовШапки.Вставить("Код", ?(СтруктураРеквизитовШапки.Свойство("Код", ПрошлоеЗначение), ПрошлоеЗначение
					+ 1, 1));

				Отбор = Новый Структура;
				Отбор.Вставить("Имя", "Код");
				Отбор.Вставить("ЭтоТЧ", Ложь);
				МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);
				Если МетаданныеСтрокиОбъектов.ТипКода = Метаданные.СвойстваОбъектов.ТипКодаСправочника.Строка Тогда
					ТекТип = ОписаниеТипа("Строка");
				Иначе
					ТекТип = ОписаниеТипа("Число");
				КонецЕсли;

				Если МассивСтрок.Количество() > 0 Тогда
					СтрокаРеквизитов = МассивСтрок[0];
				Иначе
					СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
					СтрокаРеквизитов.Имя = "Код";
					СтрокаРеквизитов.Представление = "Код";
					СтрокаРеквизитов.Тип = ТекТип;
					СтрокаРеквизитов.ЭтоТЧ = Ложь;
				КонецЕсли;
				СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(), ТекТип.Типы()));
			КонецЕсли;

			Если МетаданныеСтрокиОбъектов.ДлинаНаименования > 0 Тогда
				СтруктураРеквизитовШапки.Вставить("Наименование", ?(СтруктураРеквизитовШапки.Свойство("Наименование",
					ПрошлоеЗначение), ПрошлоеЗначение + 1, 1));

				Отбор = Новый Структура;
				Отбор.Вставить("Имя", "Наименование");
				Отбор.Вставить("ЭтоТЧ", Ложь);
				МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);
				ТекТип = ОписаниеТипа("Строка");

				Если МассивСтрок.Количество() > 0 Тогда
					СтрокаРеквизитов = МассивСтрок[0];
				Иначе
					СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
					СтрокаРеквизитов.Имя = "Наименование";
					СтрокаРеквизитов.Представление = "Наименование";
					СтрокаРеквизитов.Тип = ТекТип;
					СтрокаРеквизитов.ЭтоТЧ = Ложь;
				КонецЕсли;
				СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(), ТекТип.Типы()));
			КонецЕсли;
		КонецЕсли;

		Если ИмяВидаОдногоТипа = Неопределено Тогда
			ИмяВидаОдногоТипа = ИмяВида;
		ИначеЕсли ИмяВидаОдногоТипа <> ИмяВида Тогда
			ИмяВидаОдногоТипа = Ложь;
		КонецЕсли;

		Для Каждого РеквизитМетаданного Из МетаданныеОбъектов[ИмяВида].Реквизиты Цикл

			Если РеквизитМетаданного.Тип = ОписаниеТипаХранилище Тогда
				Продолжить;
			ИначеЕсли РеквизитМетаданного.Имя = "Вид" Тогда
				Продолжить;
			КонецЕсли;

			СтруктураРеквизитовШапки.Вставить(РеквизитМетаданного.Имя, ?(СтруктураРеквизитовШапки.Свойство(
				РеквизитМетаданного.Имя, ПрошлоеЗначение), ПрошлоеЗначение + 1, 1));

			Отбор = Новый Структура;
			Отбор.Вставить("Имя", РеквизитМетаданного.Имя);
			Отбор.Вставить("ЭтоТЧ", Ложь);
			МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);

			Если МассивСтрок.Количество() > 0 Тогда
				СтрокаРеквизитов = МассивСтрок[0];
			Иначе
				СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
				СтрокаРеквизитов.Имя = РеквизитМетаданного.Имя;
				СтрокаРеквизитов.Представление = РеквизитМетаданного.Синоним;
				СтрокаРеквизитов.Тип = РеквизитМетаданного.Тип;
				СтрокаРеквизитов.ЭтоТЧ = Ложь;
			КонецЕсли;

			СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(),
				РеквизитМетаданного.Тип.Типы()));

		КонецЦикла;
		
		//{{issues470
		МассивДополнительныхРеквизитов = ДополнитьМетаданныеРеквизитовОбщимиРеквизитами(Объект.ТипОбъекта, ИмяВида);
		
		Для Каждого ЭлементМассива Из МассивДополнительныхРеквизитов Цикл
			
			Если ЭлементМассива.Тип = ОписаниеТипаХранилище Тогда
				Продолжить;
			ИначеЕсли ЭлементМассива.Имя = "Вид" Тогда
				Продолжить;
			КонецЕсли;

			СтруктураРеквизитовШапки.Вставить(ЭлементМассива.Имя, ?(СтруктураРеквизитовШапки.Свойство(
				ЭлементМассива.Имя, ПрошлоеЗначение), ПрошлоеЗначение + 1, 1));

			Отбор = Новый Структура;
			Отбор.Вставить("Имя", ЭлементМассива.Имя);
			Отбор.Вставить("ЭтоТЧ", Ложь);
			МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);

			Если МассивСтрок.Количество() > 0 Тогда
				СтрокаРеквизитов = МассивСтрок[0];
			Иначе
				СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
				СтрокаРеквизитов.Имя = ЭлементМассива.Имя;
				СтрокаРеквизитов.Представление = ЭлементМассива.Синоним;
				СтрокаРеквизитов.Тип = ЭлементМассива.Тип;
				СтрокаРеквизитов.ЭтоТЧ = Ложь;
			КонецЕсли;

			СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(),
				ЭлементМассива.Тип.Типы()));
			
		КонецЦикла;
		//}}issues470

		Если Объект.ОбрабатыватьТабличныеЧасти Тогда

			Для Каждого РеквизитМетаданного Из МетаданныеРеквизитовТЧ Цикл

				Если РеквизитМетаданного.Тип = ОписаниеТипаХранилище Тогда
					Продолжить;
				КонецЕсли;

				СтруктураРеквизитовТЧ.Вставить(РеквизитМетаданного.Имя, ?(СтруктураРеквизитовТЧ.Свойство(
					РеквизитМетаданного.Имя, ПрошлоеЗначение), ПрошлоеЗначение + 1, 1));

				Отбор = Новый Структура;
				Отбор.Вставить("Имя", РеквизитМетаданного.Имя);
				Отбор.Вставить("ЭтоТЧ", Истина);
				МассивСтрок = ТаблицаРеквизитов.НайтиСтроки(Отбор);

				Если МассивСтрок.Количество() > 0 Тогда
					СтрокаРеквизитов = МассивСтрок[0];
				Иначе
					СтрокаРеквизитов = ТаблицаРеквизитов.Добавить();
					СтрокаРеквизитов.Имя = РеквизитМетаданного.Имя;
					СтрокаРеквизитов.Представление = РеквизитМетаданного.Синоним;
					СтрокаРеквизитов.Тип = РеквизитМетаданного.Тип;
					СтрокаРеквизитов.ЭтоТЧ = Истина;
				КонецЕсли;

				СтрокаРеквизитов.Тип = Новый ОписаниеТипов(УсечьМассив(СтрокаРеквизитов.Тип.Типы(),
					РеквизитМетаданного.Тип.Типы()));
			КонецЦикла;
		КонецЕсли;
		СтруктураТиповОбъектов.Вставить(МетаданныеОбъектов[ИмяВида].Имя, Тип(ИмяТипаТаблицы + "Ссылка." + ИмяВида));
	КонецЦикла;
	Если ИмяВидаОдногоТипа = Ложь Тогда
		ИмяВидаОдногоТипа = Неопределено;
	КонецЕсли;
	ВКонфигурацииЕстьОстаткиНоменклатуры = Не Метаданные.РегистрыНакопления.Найти("ТоварыНаСкладах") = Неопределено;
	КонтрольОстатковНоменклатуры = (Объект.ТипОбъекта = 0) И (ИмяВидаОдногоТипа = "Номенклатура")
		И ВКонфигурацииЕстьОстаткиНоменклатуры;
		//
	ДоступностьВВебПриложенииНоменклатуры = ВКонфигурацииЕстьУправлениеЗаказами И (ОБъект.ТипОбъекта = 0)
		И (ИмяВидаОдногоТипа = "Номенклатура");

		///============================= ОПРЕДЕЛЕНИЕ ОБЩИХ СВОЙСТВ И КАТЕГОРИЙ
	Для Каждого КлючИЗначение Из СтруктураТиповОбъектов Цикл
		МассивТипов.Добавить(КлючИЗначение.Значение);
	КонецЦикла;
	//	ОписаниеВсехТипов = Новый ОписаниеТипов(МассивТипов);


	///============================= ОПРЕДЕЛЕНИЕ СОСТАВА РЕКВИЗИТОВ
	Счетчик = 0;
	Для Каждого КлючИЗначение Из СтруктураРеквизитовТЧ Цикл

		Если Не КлючИЗначение.Значение = ВсегоСтрок Тогда

			СтруктураРеквизитовТЧ.Удалить(КлючИЗначение.Ключ);

		Иначе
			Счетчик = Счетчик + 1;
			СтруктураРеквизитовТЧ.Вставить(КлючИЗначение.Ключ, "Т_" + КлючИЗначение.Ключ);

		КонецЕсли;

	КонецЦикла;

	Счетчик = 0;
	Для Каждого КлючИЗначение Из СтруктураРеквизитовШапки Цикл

		Если Не КлючИЗначение.Значение = ВсегоСтрок Тогда

			СтруктураРеквизитовШапки.Удалить(КлючИЗначение.Ключ);

		Иначе
			Счетчик = Счетчик + 1;
			СтруктураРеквизитовШапки.Вставить(КлючИЗначение.Ключ, "Ш_" + КлючИЗначение.Ключ);
		КонецЕсли;

	КонецЦикла;

	///============================= ОПРЕДЕЛЕНИЕ ПОРЯДКА И ПРЕДСТАВЛЕНИЯ РЕКВИЗИТОВ
	СписокПредставлений.Добавить("Вид " + ИмяТипаТаблицы + "а", "Ш_Вид");
	СписокПредставлений.Добавить("Вид " + ИмяТипаТаблицы + "а", "Ш_ВидПредставление");
	СписокПредставлений.Добавить("Ссылка", "Объект");

	Если Объект.ОбрабатыватьТабличныеЧасти Тогда

		СписокПредставлений.Добавить("Имя ТЧ", "Т_ТЧ");
		СписокПредставлений.Добавить("Имя ТЧ", "Т_ТЧПредставление");
		СписокПредставлений.Добавить("№ строки", "Т_НомерСтроки");

		Для Каждого КлючИЗначение Из СтруктураРеквизитовТЧ Цикл
			СписокПредставлений.Добавить(МетаданныеРеквизитовТЧ[КлючИЗначение.Ключ].Представление(),
				КлючИЗначение.Значение);
		КонецЦикла;

	КонецЕсли;

	СписокПредставлений.Добавить(Префикс + "Пометка удаления", "Ш_ПометкаУдаления");

	Если Объект.ТипОбъекта = 0 И Не ИмяВидаОдногоТипа = Неопределено Тогда

		Если МетаданныеОбъектов[ИмяВидаОдногоТипа].Владельцы.Количество() > 0 Тогда

			СтруктураРеквизитовШапки.Вставить("Владелец", "Ш_Владелец");

		КонецЕсли;

		Если МетаданныеОбъектов[ИмяВидаОдногоТипа].Иерархический Тогда

			СтруктураРеквизитовШапки.Вставить("Родитель", "Ш_Родитель");

		КонецЕсли;

	КонецЕсли;

	//Если КонтрольОстатковНоменклатуры Тогда
	//	
	//	СписокПредставлений.Добавить(Префикс+"Остаток товара","Р_Остаток");
	//	СписокПредставлений.Добавить(Префикс+"Остаток-Резерв товара","Р_Резерв");
	//	
	//КонецЕсли;

	//Если ДоступностьВВебПриложенииНоменклатуры Тогда
	//	
	//	СписокПредставлений.Добавить(Префикс+"Доступна в веб-приложении ""Управление заказами""","П_ДоступнаВВебПриложенииУпрЗаказами");
	//	
	//КонецЕсли;
	Для Каждого КлючИЗначение Из СтруктураРеквизитовШапки Цикл
		МетаданныеРеквизита = МетаданныеРеквизитов.Найти(КлючИЗначение.Ключ);
		Если Не МетаданныеРеквизита = Неопределено Тогда
			СписокПредставлений.Добавить(Префикс + МетаданныеРеквизита.Представление(), КлючИЗначение.Значение);
		Иначе
			СписокПредставлений.Добавить(Префикс + КлючИЗначение.Ключ, КлючИЗначение.Значение);
		КонецЕсли;

	КонецЦикла;

	Для Каждого КлючИЗначение Из СтруктураКатегорий Цикл
		СписокПредставлений.Добавить(КлючИЗначение.Значение, КлючИЗначение.Ключ);
	КонецЦикла;

	Для Каждого КлючИЗначение Из СтруктураСвойств Цикл
		СписокПредставлений.Добавить(КлючИЗначение.Значение, КлючИЗначение.Ключ);
	КонецЦикла;

	///============================= ДОБАВЛЕНИЕ ОБЩИХ РЕКВИЗИТОВ
	СтруктураРеквизитовШапки.Вставить("ПометкаУдаления", "Ш_ПометкаУдаления");

	Если Объект.ОбрабатыватьТабличныеЧасти Тогда
		СтруктураРеквизитовТЧ.Вставить("НомерСтроки", "Т_НомерСтроки");
	КонецЕсли;

	///============================= ФОРМИРОВАНИЕ ТЕКСТА ЗАПРОСА
	ТекстЗапросаОкончание = "";

	//Если Объект.ТипОбъекта = 1 Тогда
	//	
	//	ТекстЗапросаОкончание = ТекстЗапросаОкончание + "
	//	|УПОРЯДОЧИТЬ ПО
	//	|	Ш_Дата,
	//	|	Объект";
	//	ПоляСортировки = "Ш_Дата,Объект";
	//	
	//Иначе
	//	
	//	ТекстЗапросаОкончание = ТекстЗапросаОкончание + "
	//	|УПОРЯДОЧИТЬ ПО
	//	|	Ш_Вид,
	//	|	Объект";
	//	ПоляСортировки = "Ш_Вид,Объект";
	//	
	//КонецЕсли;
	//
	//Если Объект.ОбрабатыватьТабличныеЧасти Тогда
	//	ТекстЗапросаОкончание = ТекстЗапросаОкончание + ",
	//	|	Т_ТЧ,
	//	|	Т_НомерСтроки";
	//	ПоляСортировки = ПоляСортировки + ",Т_ТЧ,Т_НомерСтроки";
	//КонецЕсли;
	ТекстЗапроса = "";

	Для Каждого Строка Из ТабличноеПолеВидыОбъектов Цикл

		Если Не Объект.ОбрабатыватьТабличныеЧасти Тогда
			ИмяВида = Строка.ИмяТаблицы;
		Иначе
			ПозТЧК = Найти(Строка.ИмяТаблицы, ".");
			ИмяВида = Лев(Строка.ИмяТаблицы, ПозТЧК - 1);
			ИмяТЧ = Сред(Строка.ИмяТаблицы, ПозТЧК + 1);
		КонецЕсли;

		Если МетаданныеОбъектов.Найти(ИмяВида) = Неопределено Тогда
			Продолжить;
		КонецЕсли;

		МетаданныеСтрокиОбъектов=МетаданныеОбъектов[ИмяВида];

		МетаданныеРеквизитов = МетаданныеСтрокиОбъектов.Реквизиты;

		Если Объект.ОбрабатыватьТабличныеЧасти Тогда
			МетаданныеРеквизитовТЧ = МетаданныеСтрокиОбъектов.ТабличныеЧасти[ИмяТЧ].Реквизиты;
		КонецЕсли;

		ИмяТаблицы = ИмяТипаТаблицы + "." + Строка.ИмяТаблицы;
		ПсевдонимТаблицы = СтрЗаменить(ИмяТаблицы, ".", "_");

		///============================= ФОРМИРОВАНИЕ ТЕКСТА ЗАПРОСА ПО РЕКВИЗИТАМ
		ТекстЗапросаОбъект = "";
		ТекстЗапросаОбъект = ТекстЗапросаОбъект + "" + Символы.ПС + "	""" + ИмяВида + """ КАК Ш_Вид";
		ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	""" + СтрЗаменить(
			МетаданныеОбъектов[ИмяВида].Представление(), """", "") + """ КАК Ш_ВидПредставление";
		ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	" + ПсевдонимТаблицы + "." + Префикс
			+ "Ссылка КАК Объект";

		Для Каждого КлючИЗначение Из СтруктураРеквизитовШапки Цикл
			МетаданноеРеквизита = МетаданныеРеквизитов.Найти(КлючИЗначение.Ключ);
			Если Не МетаданноеРеквизита = Неопределено И МетаданноеРеквизита.Тип.СодержитТип(Тип("Строка"))
				И МетаданноеРеквизита.Тип.КвалификаторыСтроки.Длина = 0 Тогда
				ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	ПОДСТРОКА(" + ПсевдонимТаблицы + "."
					+ Префикс + КлючИЗначение.Ключ + ",1," + ОграничениеНаСтрокиНеограниченнойДлины + ")";
			Иначе
				ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	" + ПсевдонимТаблицы + "." + Префикс
					+ КлючИЗначение.Ключ;
			КонецЕсли;
			ТекстЗапросаОбъект = ТекстЗапросаОбъект + " КАК " + КлючИЗначение.Значение;
		КонецЦикла;

		Если Объект.ОбрабатыватьТабличныеЧасти Тогда

			ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	""" + ИмяТЧ + """ КАК Т_ТЧ";
			ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	"""
				+ МетаданныеСтрокиОбъектов.ТабличныеЧасти[ИмяТЧ].Представление() + """ КАК Т_ТЧПредставление";

			Для Каждого КлючИЗначение Из СтруктураРеквизитовТЧ Цикл

				МетаданноеРеквизита = МетаданныеРеквизитовТЧ.Найти(КлючИЗначение.Ключ);

				Если Не МетаданноеРеквизита = Неопределено И МетаданноеРеквизита.Тип.СодержитТип(Тип("Строка"))
					И МетаданноеРеквизита.Тип.КвалификаторыСтроки.Длина = 0 Тогда

					ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	ПОДСТРОКА(" + ПсевдонимТаблицы
						+ "." + КлючИЗначение.Ключ + ",1," + ОграничениеНаСтрокиНеограниченнойДлины + ")";

				Иначе

					ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	" + ПсевдонимТаблицы + "."
						+ КлючИЗначение.Ключ;

				КонецЕсли;

				ТекстЗапросаОбъект = ТекстЗапросаОбъект + " КАК " + КлючИЗначение.Значение;

			КонецЦикла;
		КонецЕсли;

		///============================= ФОРМИРОВАНИЕ ТЕКСТА ЗАПРОСА ПО СВОЙСТВАМ И КАТЕГОРИЯМ
		Если ОтборПоКатегориям Тогда
		//
			//Для каждого КлючИЗначение Из СтруктураКатегорий Цикл
			//	
			//	ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + 
			//	"	ВЫБОР КОГДА Таблица_"+КлючИЗначение.Ключ+".Категория ЕСТЬ NULL ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ КАК " + КлючИЗначение.Ключ;
			//	
			//КонецЦикла; 
		КонецЕсли;

		Если ОтборПоСвойствам Тогда

		//Для каждого КлючИЗначение Из СтруктураСвойств Цикл
			//	
			//	ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + Символы.ПС + "	Таблица_"+КлючИЗначение.Ключ+".Значение КАК "+КлючИЗначение.Ключ;
			//	
			//КонецЦикла; 
		КонецЕсли;

		///============================= ФОРМИРОВАНИЕ ТЕКСТА ЗАПРОСА ПО ОСТАТКАМ НОМЕНКЛАТУРЫ
		Если КонтрольОстатковНоменклатуры Тогда

		//ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + "
			//|	ЕСТЬNULL(Таблица_Р_Остаток.КоличествоОстаток,0) Как Р_Остаток,
			//|	ЕСТЬNULL(Таблица_Р_Остаток.КоличествоОстаток, 0) - ЕСТЬNULL(Таблица_Р_Резерв.КоличествоОстаток, 0) КАК Р_Резерв";
		КонецЕсли;

		Если ДоступностьВВебПриложенииНоменклатуры Тогда

		//ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + "
			//|	ВЫБОР
			//|		КОГДА Таблица_П_Веб.Номенклатура ЕСТЬ NULL ТОГДА Истина
			//|		ИНАЧЕ Ложь
			//|	КОНЕЦ КАК П_ДоступнаВВебПриложенииУпрЗаказами";
		КонецЕсли;

		///============================= ФОРМИРОВАНИЕ ТЕКСТА ЗАПРОСА ПО "ИЗ" И "СОЕДИНЕНИЕ"
		ТекстЗапросаОбъект = ТекстЗапросаОбъект + Символы.ПС + "ИЗ" + Символы.ПС + "	" + ИмяТаблицы + " КАК "
			+ ПсевдонимТаблицы;
		Если ОтборПоКатегориям Тогда
		//
			//Для каждого КлючИЗначение Из СтруктураКатегорий Цикл
			//	
			//	ТекстЗапросаОбъект = ТекстЗапросаОбъект + "
			//	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииОбъектов КАК Таблица_"+КлючИЗначение.Ключ+"
			//	|		ПО " + ПсевдонимТаблицы + ".Ссылка = Таблица_"+КлючИЗначение.Ключ+".Объект
			//	|		И (Таблица_"+КлючИЗначение.Ключ+".Категория = &"+КлючИЗначение.Ключ+")";
			//	
			//	
			//КонецЦикла;
		КонецЕсли;

		Если ОтборПоСвойствам Тогда

		//Для каждого КлючИЗначение Из СтруктураСвойств Цикл
			//	
			//	ТекстЗапросаОбъект = ТекстЗапросаОбъект + "
			//	|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК Таблица_"+КлючИЗначение.Ключ+"
			//	|		ПО " + ПсевдонимТаблицы + ".Ссылка = Таблица_"+КлючИЗначение.Ключ+".Объект
			//	|		И (Таблица_"+КлючИЗначение.Ключ+".Свойство = &"+КлючИЗначение.Ключ+")";
			//	
			//КонецЦикла;
		КонецЕсли;

		Если КонтрольОстатковНоменклатуры Тогда

		//ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + "
			//|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК Таблица_Р_Остаток
			//|		ПО " + ПсевдонимТаблицы + ".Ссылка = Таблица_Р_Остаток.Номенклатура
			//|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки КАК Таблица_Р_Резерв
			//|		ПО " + ПсевдонимТаблицы + ".Ссылка = Таблица_Р_Резерв.Номенклатура";
			//
		КонецЕсли;

		Если ДоступностьВВебПриложенииНоменклатуры Тогда

		//ТекстЗапросаОбъект = ТекстЗапросаОбъект + "," + "
			//|	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураНеиспользуемаяВВебУправленииЗаказами КАК Таблица_П_Веб
			//|	ПО " + ПсевдонимТаблицы + ".Ссылка = Таблица_П_Веб.Номенклатура";
			//
		КонецЕсли;

		Если Объект.ТипОбъекта = 0 И МетаданныеСтрокиОбъектов.Иерархический И МетаданныеСтрокиОбъектов.ВидИерархии
			= Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов Тогда

			ТекстЗапросаОбъект = ТекстЗапросаОбъект + "
													  |ГДЕ
													  |	" + ПсевдонимТаблицы + ".Ссылка.ЭтоГруппа = ЛОЖЬ";

		КонецЕсли;

		ТекстЗапроса = ?(ТекстЗапроса = "", "Выбрать ", ТекстЗапроса + Символы.ПС + Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ"
			+ Символы.ПС + Символы.ПС + "ВЫБРАТЬ") + ТекстЗапросаОбъект;

		ТекстЗапросаОбъект = "Выбрать " + ТекстЗапросаОбъект + ТекстЗапросаОкончание;
		масЗапросовПоОбъектам.Добавить(ТекстЗапросаОбъект);

	КонецЦикла;

	ТекстЗапроса = ТекстЗапроса + ТекстЗапросаОкончание;

	НовыйТекстЗапроса = "Выбрать РАЗРЕШЕННЫЕ * ИЗ (" + ТекстЗапроса + ") КАК _Таблица";

		///============================= СОХРАНЕНИЕ НАСТРОЕК ОТБОРА ПРЕДЫДУЩЕГО ЗАПРОСА
	//Для Индекс = 0 По ПостроительЗапроса_Отбор.Количество() - 1 Цикл
	//	МассивНастроекОтбора.Добавить(ПостроительЗапроса_Отбор.Получить(Индекс));
	//КонецЦикла; 

	///============================= ИНИЦИАЛИЗАЦИЯ ТЕКСТА И ПОЛЕЙ ЗАПРОСА


	//ТекстЗапроса = ПолучитьТекстЗапроса();
	ТекстЗапроса = НовыйТекстЗапроса;
	ТекстПроизвольногоЗапроса = ТекстЗапроса;
	ОтборДанных = Неопределено;
	ПараметрыЗапроса.Очистить();

	//ПостроительЗапроса.Текст = ТекстЗапроса;
	//ПостроительЗапроса.ЗаполнитьНастройки();
	//
	//КоличествоПолей = ПостроительЗапроса.ДоступныеПоля.Количество();
	//Для к = 0 По КоличествоПолей - 1 Цикл
	//	ДоступноеПоле = ПостроительЗапроса.ДоступныеПоля[КоличествоПолей - к - 1];
	//	
	//	Если ПостроительЗапроса.ВыбранныеПоля.Найти(ДоступноеПоле.Имя) = Неопределено Тогда
	//		ПостроительЗапроса.ДоступныеПоля.Удалить(ДоступноеПоле);
	//	КонецЕсли;
	//КонецЦикла;
	//
	//КоличествоПолей = ПостроительЗапроса.ВыбранныеПоля.Количество();
	//Для к = 0 По КоличествоПолей - 1 Цикл
	//	ИмяПоля = ПостроительЗапроса.ВыбранныеПоля[КоличествоПолей - к - 1].Имя;
	//	ДоступноеПоле = ПостроительЗапроса.ДоступныеПоля.Найти(ИмяПоля);
	//	ПостроительЗапроса.ДоступныеПоля.Сдвинуть(ДоступноеПоле,-1000);
	//	
	//КонецЦикла;
	// 
	//
	//Для каждого ЭлементПредставления Из СписокПредставлений Цикл
	//	ДоступноеПоле = ПостроительЗапроса.ДоступныеПоля.Найти(ЭлементПредставления.Представление);
	//	Если Не ДоступноеПоле = Неопределено Тогда
	//		
	//		ДоступноеПоле.Представление = ПолучитьПредставление(ЭлементПредставления);
	//		Если Лев(ДоступноеПоле.Имя , 2) = "С_" Тогда
	//			ДоступноеПоле.ТипЗначения = СтруктураСвойств[ДоступноеПоле.Имя].ТипЗначения;
	//		КонецЕсли; 
	//		
	//	КонецЕсли;
	//	 
	//КонецЦикла; 
	//
	//ДоступныеПоляОтбора = ПостроительЗапроса.Отбор.ПолучитьДоступныеПоля();
	//ДоступныеПоляОтбора.Удалить(ДоступныеПоляОтбора.Ш_ВидПредставление);
	//ДоступныеПоляОтбора.Ш_Ссылка.Поля.Очистить();
	////ДоступныеПоляОтбора.Удалить(ДоступныеПоляОтбора.Ш_Ссылка);
	//Если Объект.ОбрабатыватьТабличныеЧасти Тогда
	//	ДоступныеПоляОтбора.Удалить(ДоступныеПоляОтбора.Т_ТЧПредставление);
	//	ДоступныеПоляОтбора.Удалить(ДоступныеПоляОтбора.Т_ТЧ);
	//КонецЕсли; 
	//
	/////============================= ВОССТАНОВЛЕНИЕ НАСТРОЕК ОТБОРА ПРЕДЫДУЩЕГО ЗАПРОСА
	//Для каждого ЭлементОтбора Из МассивНастроекОтбора Цикл
	//	ДоступноеПоле = ДоступныеПоляОтбора.Найти(ЭлементОтбора.ПутьКДанным);
	//	Попытка
	//		НовыйЭлементОтбора = ПостроительЗапроса.Отбор.Добавить(ЭлементОтбора.ПутьКДанным);
	//		НовыйЭлементОтбора.Использование = ЭлементОтбора.Использование;
	//		НовыйЭлементОтбора.ВидСравнения = ЭлементОтбора.ВидСравнения;
	//		НовыйЭлементОтбора.Значение = ЭлементОтбора.Значение;
	//		НовыйЭлементОтбора.ЗначениеС = ЭлементОтбора.ЗначениеС;
	//		НовыйЭлементОтбора.ЗначениеПо = ЭлементОтбора.ЗначениеПо;
	//	Исключение
	//	КонецПопытки; 
	//КонецЦикла; 
	//
	//
	ПредопределенныеРеквизиты = Новый СписокЗначений;
	//Макет = ПолучитьМакет("ПредопределенныеРеквизиты");
	//Область = Макет.Области[?(Объект.ТипОбъекта = 0,"Справочники","Документы")];
	//Счетчик = 0;
	//ВидОбъекта = "*";
	//Для к =  Область.Верх По Область.Низ Цикл
	//	
	//	ТекВидОбъекта = СокрЛП(Макет.Область("R"+к+"C1").Текст);
	//	
	//	Если  ТекВидОбъекта <> "" Тогда
	//		Если ТекВидОбъекта = "*" Тогда
	//			ВидОбъекта = ТекВидОбъекта;
	//		Иначе
	//			ВидОбъекта = ТекВидОбъекта;
	//		КонецЕсли; 
	//		
	//	КонецЕсли;
	//	
	//	Если ИмяВидаОдногоТипа = ВидОбъекта ИЛИ ВидОбъекта = "*" Тогда
	//		
	//		ПолноеИмяРеквизита = СокрЛП(Макет.Область("R"+к+"C2").Текст);
	//		Описание = СокрЛП(Макет.Область("R"+к+"C3").Текст);
	//		ЧерезТочку = Ложь;
	//		ПозТЧК = Найти(ПолноеИмяРеквизита,".");
	//		ЭтоСоставнойРеквизит = Не(ПозТЧК = 0);
	//		ИмяКорня = "Ш_"+?(ПозТЧК = 0,ПолноеИмяРеквизита,Лев(ПолноеИмяРеквизита,ПозТЧК-1));
	//		//ПолеНастройки = ПостроительЗапроса.ДоступныеПоля.Найти(ИмяКорня);
	//		//Пока Не ПозТЧК = 0 И Не ПолеНастройки = Неопределено Цикл
	//		//	ПолноеИмяРеквизита = Сред(ПолноеИмяРеквизита,ПозТЧК+1);
	//		//	ПозТЧК = Найти(ПолноеИмяРеквизита,".");
	//		//	ПолеНастройки = ПолеНастройки.Поля.Найти(?(ПозТЧК = 0,ПолноеИмяРеквизита,Лев(ПолноеИмяРеквизита,ПозТЧК-1)));
	//		//	ЧерезТочку = Истина;
	//		//КонецЦикла; 
	//		//Если Не ПолеНастройки = Неопределено Тогда
	//			Если ЭтоСоставнойРеквизит Тогда
	//				Счетчик = Счетчик+1;
	//				//ПостроительЗапроса.ВыбранныеПоля.Добавить(ПолеНастройки.ПутьКДанным,"Д_"+Счетчик);
	//				СписокПредставлений.Добавить(Описание,"Д_"+Счетчик);
	//				ПредопределенныеРеквизиты.Добавить(Новый Структура("Имя,ПолеНастройки","Д_"+Счетчик,ПолеНастройки),Описание);
	//			Иначе
	//				ПредопределенныеРеквизиты.Добавить(Новый Структура("Имя,ПолеНастройки",ПолеНастройки.Имя,ПолеНастройки),Описание);
	//			КонецЕсли; 
	//			
	//		//КонецЕсли; 
	//		
	//	КонецЕсли; 
	//КонецЦикла; 
	////
	/////============================= 
	//ПостроительЗапроса_Отбор = ПостроительЗапроса.Отбор;
	//ПостроительЗапроса.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	ОтображаемыеКолонки = Новый Структура("Ш_ВидПредставление,Ш_Ссылка");
	Если Объект.ОбрабатыватьТабличныеЧасти Тогда
		ОтображаемыеКолонки.Вставить("Т_ТЧПредставление");
		ОтображаемыеКолонки.Вставить("Т_НомерСтроки");
	КонецЕсли;
	мСформированныйРежим = Новый Структура("СписокПредставлений,ДанныеОтобраны,ИмяВидаОдногоТипа,ПредопределенныеРеквизиты,ОтображаемыеКолонки,СтруктураСвойств,СтруктураКатегорий",
		СписокПредставлений, Ложь, ИмяВидаОдногоТипа, ПредопределенныеРеквизиты, ОтображаемыеКолонки, СтруктураСвойств,
		СтруктураКатегорий);

КонецПроцедуры

// ИнициализацияЗапроса() 
&НаКлиенте
Процедура ПроверкаНеобходимостиОчищатьРезультаты(ОписаниеОповещенияОЗавершении)

	ДополнительныеПараметрыОповщения=Новый Структура;
	ДополнительныеПараметрыОповщения.Вставить("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении);

	Если Не мСформированныйРежим = Неопределено И мСформированныйРежим.ДанныеОтобраны Тогда
		ВопросОбОчисткеРезультатаОтбора(Новый ОписаниеОповещения("ПроверкаНеобходимостиОчищатьРезультатыЗавершение",
			ЭтотОбъект, ДополнительныеПараметрыОповщения));
	КонецЕсли;

	ПроверкаНеобходимостиОчищатьРезультатыЗавершение(Истина, ДополнительныеПараметрыОповщения);
КонецПроцедуры

&НаКлиенте
Процедура ПроверкаНеобходимостиОчищатьРезультатыЗавершение(Результат, ДополнительныеПараметры) Экспорт
	ОповщениеОЗавершении=ДополнительныеПараметры.ОписаниеОповещенияОЗавершении;
	Если Результат Тогда
		ОчиститьРезультаты();
		мСформированныйРежим = Неопределено;
	КонецЕсли;

	ВыполнитьОбработкуОповещения(ОповщениеОЗавершении, Результат);
КонецПроцедуры
&НаКлиенте
Процедура ВопросОбОчисткеРезультатаОтбора(ОписаниеОповещенияОЗавершении) Экспорт
	Ответ = Неопределено;

	ПоказатьВопрос(Новый ОписаниеОповещения("ВопросОбОчисткеРезультатаОтбораЗавершение", ЭтаФорма,
		Новый Структура("ОписаниеОповещенияОЗавершении", ОписаниеОповещенияОЗавершении)),
		"Результат отбора будет очищен. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
КонецПроцедуры

&НаКлиенте
Процедура ВопросОбОчисткеРезультатаОтбораЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	ОписаниеОповещенияОЗавершении = ДополнительныеПараметры.ОписаниеОповещенияОЗавершении;
	Результат=РезультатВопроса = КодВозвратаДиалога.Отмена;
	ВыполнитьОбработкуОповещения(ОписаниеОповещенияОЗавершении, Результат);

КонецПроцедуры

// () 
&НаКлиенте
Процедура ТабличноеПолеВидыОбъектовПослеУдаления(Элемент)
	ПроверкаНеобходимостиОчищатьРезультаты(Новый ОписаниеОповещения("ТабличноеПолеВидыОбъектовПослеУдаленияЗавершение",
		ЭтотОбъект));
КонецПроцедуры

&НаКлиенте
Процедура ТабличноеПолеВидыОбъектовПослеУдаленияЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат Тогда
		ИнициализацияЗапроса();
	КонецЕсли;
КонецПроцедуры
Процедура ОчиститьРезультаты()
	НайденныеОбъекты.Очистить();
КонецПроцедуры

// () 
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
	МассивСтрокКУдалению=Новый Массив;
	МетаданныеОбъектов=Метаданные[?(Объект.ТипОбъекта = 1, "Документы", "Справочники")];

	Для Каждого СтрокаТаблицы Из ТабличноеПолеВидыОбъектов Цикл
		МассивИмени=СтрРазделить(СтрокаТаблицы.ИмяТаблицы, ".");

		ИмяВида=МассивИмени[0];
		Если МетаданныеОбъектов.Найти(ИмяВида) = Неопределено Тогда
			МассивСтрокКУдалению.Добавить(СтрокаТаблицы);
		КонецЕсли;
	КонецЦикла;
	
	//Удаляем того что сейчас не можем обработать
	Для Каждого УдаляемаяСтрока Из МассивСтрокКУдалению Цикл
		ТабличноеПолеВидыОбъектов.Удалить(УдаляемаяСтрока);
	КонецЦикла;

	ИнициализацияЗапроса();
	РеквизитФормыВЗначение("Объект").ЗагрузитьОбработки(ЭтаФорма, ДоступныеОбработки, ВыбранныеОбработки);

КонецПроцедуры

&НаКлиенте
Процедура ОбрабатыватьТабличныеЧастиПриИзменении(Элемент)
	ПроверкаНеобходимостиОчищатьРезультаты(Новый ОписаниеОповещения("ОбрабатыватьТабличныеЧастиПриИзмененииЗавершение",
		ЭтотОбъект, Новый Структура("Элемент", Элемент)));
КонецПроцедуры

&НаКлиенте
Процедура ОбрабатыватьТабличныеЧастиПриИзмененииЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Элемент=ДополнительныеПараметры.Элемент;
	Если Результат Тогда
		ТабличноеПолеВидыОбъектов.Очистить();
		ИнициализацияЗапроса();
	Иначе
		Элемент.Значение = Не Элемент.Значение;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ТипОбъектаПриИзменении(Элемент)
	ТабличноеПолеВидыОбъектов.Очистить();
	ИнициализацияЗапроса();
КонецПроцедуры

&НаКлиенте
Процедура НайденныеОбъектыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	ДанныеТекущейСтроки=НайденныеОбъекты.НайтиПоИдентификатору(ВыбраннаяСтрока);
	ПоказатьЗначение(Неопределено, ДанныеТекущейСтроки.Объект);
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_НастроитьПараметрыЗаписи(Команда)
	УИ_ОбщегоНазначенияКлиент.РедактироватьПараметрыЗаписи(ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьОбъект(Команда)
	ТекДанные=Элементы.НайденныеОбъекты.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(ТекДанные.Объект);
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) Экспорт
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры

//{{issues470
&НаСервере
Функция ДополнитьМетаданныеРеквизитовОбщимиРеквизитами(ТипОбъекта, ИмяВида)
	
	МассивДополнительныхРеквизитов = Новый Массив;
	
	Для Каждого ОбщийРеквизит Из Метаданные.ОбщиеРеквизиты Цикл
		Для Каждого ЭлементСостава Из ОбщийРеквизит.Состав Цикл
			Если ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать
				  И ТипОбъекта = 1 Тогда
				Если ЭлементСостава.Метаданные = Метаданные.Документы[ИмяВида] Тогда
					МассивДополнительныхРеквизитов.Добавить(ОбщийРеквизит);
				КонецЕсли;
			ИначеЕсли ЭлементСостава.Использование = Метаданные.СвойстваОбъектов.ИспользованиеОбщегоРеквизита.Использовать Тогда
				Если ЭлементСостава.Метаданные = Метаданные.Справочники[ИмяВида] Тогда
					МассивДополнительныхРеквизитов.Добавить(ОбщийРеквизит);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат МассивДополнительныхРеквизитов;
	
КонецФункции
//}}issues470
